#include "Warrior.h"
#include <stdlib>
//-----------------------------------------------------------------------------
void Warrior::SetAtributos(AnsiString c_name,int c_hp,int c_atq,int c_def,int c_aci,int c_esq,int c_reg,int c_vel,int c_mag)
{
    this->name = c_name;
    this->hp = c_hp;
    this->atq = c_atq;
    this->def = c_def;
    this->aci = c_aci;
    this->esq = c_esq;
    this->reg = c_reg;
    this->vel = c_vel;
    this->mag = c_mag;
}
//-----------------------------------------------------------------------------
int Warrior::Atacar(Warrior &defender)
{
    int resultado;

    if ((1+rand() % 100)  <= this->aci - defender.GetEsq())
    {     // Golpe Normal
      if ((rand() % 5)) resultado=1;
          // Ataque Critico
      else  resultado=2;
    }     // Fallo
    else    resultado=0;
    return resultado;

}
//-----------------------------------------------------------------------------
int Warrior::Herir(bool tipodam,Warrior &defender)
{
    int dam;
    if(tipodam)
    {
        defender.ChangeHP(-(this->atq-defender.GetDef()));
        dam=this->atq-defender.GetDef();
    }
    else
    {
        defender.ChangeHP(-(this->atq));
        dam=this->atq;
    }
    return dam;
}
//-----------------------------------------------------------------------------
void Warrior::Magia(Warrior &enemigo, int **efects)
{
    #que lio
    int vez=1;
    if((1+rand()%100)<50)
    {
        efects[0][0]=1;
        if((1+rand()%100) < (90-enemigo.GetMag()+this->mag))
        {
            Efecto(enemigo,efects,vez++);
            if((1+rand()%100) < (70-enemigo.GetMag()+this->mag))
            {
                Efecto(enemigo,efects,vez++);
                if((1+rand()%100) < (50-enemigo.GetMag()+this->mag))
                {
                    Efecto(enemigo,efects,vez++);
                    if((1+rand()%100) < (30-enemigo.GetMag()+this->mag))
                    {
                        Efecto(enemigo,efects,vez++);
                        if((1+rand()%100) < (10-enemigo.GetMag()+this->mag))
                            Efecto(enemigo,efects,vez);
                    }
                }
            }
        }
    }
    else
    {
        //efects[0][0]=2;
        if((1+rand()%100) < (90+this->mag))
        {
            Efecto(efects,vez++);
            if((1+rand()%100) < (70+this->mag))
            {
                Efecto(efects,vez++);
                if((1+rand()%100) < (50+this->mag))
                {
                    Efecto(efects,vez++);
                    if((1+rand()%100) < (30+this->mag))
                    {
                        Efecto(efects,vez++);
                        if((1+rand()%100) < (10+this->mag))
                            Efecto(efects,vez);
                    }
                }
            }
        }
    }
}
//-----------------------------------------------------------------------------
void Warrior::Efecto(Warrior &objetivo,int** efects,int vez)
{
    switch((1+rand())%8)
    {
        case 0:
            efects[vez][0]=0;
            objetivo.ChangeHP(efects[vez][1]=-this->mag);
            break;
        case 1:
            efects[vez][0]=1;
            objetivo.atq+=(efects[vez][1]=-this->mag/6);
            break;
        case 2:
            efects[vez][0]=2;
            objetivo.def+=(efects[vez][1]=-this->mag/4);
            break;
        case 3:
            efects[vez][0]=3;
            objetivo.aci+=(efects[vez][1]=-this->mag/3);
            break;
        case 4:
            efects[vez][0]=4;
            objetivo.esq+=(efects[vez][1]=-this->mag/6);
            break;
        case 5:
            efects[vez][0]=5;
            objetivo.reg+=(efects[vez][1]=-this->mag/5);
            break;
        case 6:
            efects[vez][0]=6;
            objetivo.vel+=(efects[vez][1]=-this->mag/2);
            break;
        case 7:
            efects[vez][0]=7;
            objetivo.mag+=(efects[vez][1]=-this->mag/7);
            break;
    }
}
//-----------------------------------------------------------------------------
void Warrior::Efecto(int** efects,int vez)
{
    switch((1+rand())%8)
    {
        case 0:
            efects[vez][0]=0;
            this->hp+=(efects[vez][1]=this->mag);
            break;
        case 1:
            efects[vez][0]=1;
            this->atq+=(efects[vez][1]=this->mag/5);
            break;
        case 2:
            efects[vez][0]=2;
            this->def+=(efects[vez][1]=this->mag/5);
            break;
        case 3:
            efects[vez][0]=3;
            this->aci+=(efects[vez][1]=this->mag/2);
            break;
        case 4:
            efects[vez][0]=4;
            this->esq+=(efects[vez][1]=this->mag/5);
            break;
        case 5:
            efects[vez][0]=5;
            this->reg+=(efects[vez][1]=this->mag/5);
            break;
        case 6:
            efects[vez][0]=6;
            this->vel+=(efects[vez][1]=this->mag/5);
            break;
        case 7:
            efects[vez][0]=7;
            this->mag+=(efects[vez][1]=this->mag/5);
            break;
    }
}
//-----------------------------------------------------------------------------

void Warrior::Defender()
{
      if (!this->contadorDefensa) this->def *= 2;
      this->contadorDefensa = 1;

}
//-----------------------------------------------------------------------------

void Warrior::comprobarDefensa()
{
   if(this->contadorDefensa > 2){
      this->contadorDefensa = 0;
      this->def /= 2;
   }
   if(this->contadorDefensa) this->contadorDefensa+=1;
}
//-----------------------------------------------------------------------------

int Warrior::SacrificioAtq(Warrior &defender)
{
       int resultado;

    if ((1+rand() % 100)  <= (this->aci - 20) - defender.GetEsq())
    {     // Golpe Normal
      if ((rand() % 5)) resultado=1;
          // Ataque Critico
      else  resultado=2;
    }     // Fallo
    else    resultado=0;
    return resultado;
}
//----------------------------------------------------------------------------

int Warrior::SacrificioHerir(bool tipodam,Warrior &defender)
{
    int dam;
    if(tipodam)
    {
        defender.ChangeHP(-(this->atq-defender.GetDef()));
        dam=(this->atq*2)-defender.GetDef();
    }
    else
    {
        defender.ChangeHP(-(this->atq));
        dam=(this->atq*2);
    }
    return dam;
}
